package io;

import java.io.*;

public class CopyDemo3 {
    public static void main(String[] args) throws IOException {
        /*
         * java将流分类两类
         * 节点流:又称为低级流，特点：他们是实际链接程序与另一端的"管道"，负责实际读写数据的流
         * 处理流:有称为高级流，特点:不能独立存在，必须连接在其他流上，目的是当数据经过该高级流时堆其进行某种加工处理，简化我们的同等操作
         *
         * 实际开发中，我们进行一个复杂的IO操作时，总会串联一组高级流到某个低级流上，对读写的数据进行流水线式的加工处理。这个操作也被称为"流的链接"
         *
         * 常见的高级流:
         * 缓冲流:作用是加快读写效率
         * 压缩流:进行数据的压缩与解压缩(读写zip文件)
         * 音频流:进行尹斌编解码
         * 对象流:进行java对象的序列化和反序列化
         * */

        /*
         * 缓冲流:
         * java.io.BufferedInputStream和BufferedOutputStream
         * 缓冲流作用:大幅加快读写效率(底层就是在进行8kb8kb的进行读写操作 并不是真的还在1字节1字节的走)
         * */

        FileInputStream fis = new FileInputStream("./img.png");
        BufferedInputStream bis = new BufferedInputStream(fis); //缓冲输入流链接到文件流输入上

        FileOutputStream fos = new FileOutputStream("./img_cp4.png");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        long start = System.currentTimeMillis();
        int a;
        byte[] by = new byte[bis.available()];
        while ((a = bis.read(by)) != -1) {
            bos.write(by);
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);
        //关闭流的时候直接关闭最上层的高级流就可以 他会自动关闭它下层的流
        bis.close();
        ;
        bos.close();
    }
}
